//! 中国行政区划数据模块

use once_cell::sync::Lazy;
use lazy_static::lazy_static;
use rand::prelude::SliceRandom;
use rand::Rng;
use serde_json::Value;
use std::fs;

/// 从文件加载省份数据
static PROVINCES: Lazy<Vec<String>> = Lazy::new(|| {
    load_data_from_file("data/regions/china/provinces.txt")
});

/// 从文件加载街道后缀数据
static STREET_SUFFIXES: Lazy<Vec<String>> = Lazy::new(|| {
    load_data_from_file("data/regions/china/street_suffixes.txt")
});

/// 从文件加载数据的辅助函数
fn load_data_from_file(file_path: &str) -> Vec<String> {
    match fs::read_to_string(file_path) {
        Ok(content) => content
            .lines()
            .map(|line| line.trim().to_string())
            .filter(|line| !line.is_empty())
            .collect(),
        Err(_) => {
            // 如果文件不存在，返回默认数据
            match file_path {
                "data/regions/china/provinces.txt" => vec![
                    "北京市".to_string(), "天津市".to_string(), "河北省".to_string(),
                    "山西省".to_string(), "内蒙古自治区".to_string(), "辽宁省".to_string(),
                    "吉林省".to_string(), "黑龙江省".to_string(), "上海市".to_string(),
                    "江苏省".to_string(), "浙江省".to_string(), "安徽省".to_string()
                ],
                "data/regions/china/street_suffixes.txt" => vec![
                    "街".to_string(), "路".to_string(), "巷".to_string(),
                    "大道".to_string(), "胡同".to_string(), "里".to_string()
                ],
                _ => vec!["Default".to_string()]
            }
        }
    }
}

lazy_static! {
    /// GB2312 一级汉字（3755个）和二级汉字（3008个）的 Unicode 范围
    static ref GB2312_RANGES: [(u32, u32); 72] = [
        // 一级汉字（16-55区）
        (0xB0A1, 0xB0FE), // 16区
        (0xB1A1, 0xB1FE), // 17区
        (0xB2A1, 0xB2FE), // 18区
        (0xB3A1, 0xB3FE), // 19区
        (0xB4A1, 0xB4FE), // 20区
        (0xB5A1, 0xB5FE), // 21区
        (0xB6A1, 0xB6FE), // 22区
        (0xB7A1, 0xB7FE), // 23区
        (0xB8A1, 0xB8FE), // 24区
        (0xB9A1, 0xB9FE), // 25区
        (0xBAA1, 0xBAFE), // 26区
        (0xBBA1, 0xBBFE), // 27区
        (0xBCA1, 0xBCFE), // 28区
        (0xBDA1, 0xBDFE), // 29区
        (0xBEA1, 0xBEFE), // 30区
        (0xBFA1, 0xBFFE), // 31区
        (0xC0A1, 0xC0FE), // 32区
        (0xC1A1, 0xC1FE), // 33区
        (0xC2A1, 0xC2FE), // 34区
        (0xC3A1, 0xC3FE), // 35区
        (0xC4A1, 0xC4FE), // 36区
        (0xC5A1, 0xC5FE), // 37区
        (0xC6A1, 0xC6FE), // 38区
        (0xC7A1, 0xC7FE), // 39区
        (0xC8A1, 0xC8FE), // 40区
        (0xC9A1, 0xC9FE), // 41区
        (0xCAA1, 0xCAFE), // 42区
        (0xCBA1, 0xCBFE), // 43区
        (0xCCA1, 0xCCFE), // 44区
        (0xCDA1, 0xCDFE), // 45区
        (0xCEA1, 0xCEFE), // 46区
        (0xCFA1, 0xCFFE), // 47区
        (0xD0A1, 0xD0FE), // 48区
        (0xD1A1, 0xD1FE), // 49区
        (0xD2A1, 0xD2FE), // 50区
        (0xD3A1, 0xD3FE), // 51区
        (0xD4A1, 0xD4FE), // 52区
        (0xD5A1, 0xD5FE), // 53区
        (0xD6A1, 0xD6FE), // 54区
        (0xD7A1, 0xD7FE), // 55区

        // 二级汉字（56-87区）
        (0xD8A1, 0xD8FE), // 56区
        (0xD9A1, 0xD9FE), // 57区
        (0xDAA1, 0xDAFE), // 58区
        (0xDBA1, 0xDBFE), // 59区
        (0xDCA1, 0xDCFE), // 60区
        (0xDDA1, 0xDDFE), // 61区
        (0xDEA1, 0xDEFE), // 62区
        (0xDFA1, 0xDFFE), // 63区
        (0xE0A1, 0xE0FE), // 64区
        (0xE1A1, 0xE1FE), // 65区
        (0xE2A1, 0xE2FE), // 66区
        (0xE3A1, 0xE3FE), // 67区
        (0xE4A1, 0xE4FE), // 68区
        (0xE5A1, 0xE5FE), // 69区
        (0xE6A1, 0xE6FE), // 70区
        (0xE7A1, 0xE7FE), // 71区
        (0xE8A1, 0xE8FE), // 72区
        (0xE9A1, 0xE9FE), // 73区
        (0xEAA1, 0xEAFE), // 74区
        (0xEBA1, 0xEBFE), // 75区
        (0xECA1, 0xECFE), // 76区
        (0xEDA1, 0xEDFE), // 77区
        (0xEEA1, 0xEEFE), // 78区
        (0xEFA1, 0xEFFE), // 79区
        (0xF0A1, 0xF0FE), // 80区
        (0xF1A1, 0xF1FE), // 81区
        (0xF2A1, 0xF2FE), // 82区
        (0xF3A1, 0xF3FE), // 83区
        (0xF4A1, 0xF4FE), // 84区
        (0xF5A1, 0xF5FE), // 85区
        (0xF6A1, 0xF6FE), // 86区
        (0xF7A1, 0xF7FE)  // 87区
    ];
}

/// 生成随机省份
pub fn province() -> Value {
    let mut rng = rand::thread_rng();
    Value::String(PROVINCES.choose(&mut rng).unwrap().clone())
}

/// 生成指定长度的中文街道前缀
pub fn rand_chinese(range: std::ops::Range<usize>) -> String {
    let len = rand::Rng::gen_range(&mut rand::thread_rng(), range);
    (0..len).map(|_| rand_hanzi()).collect()
}

/// 生成随机中文街道
pub fn random_street() -> Value {
    let mut rng = rand::thread_rng();
    // 街道名前缀长度（2-4个汉字）
    let prefix_len = rng.gen_range(2..=4);
    let suffix = STREET_SUFFIXES.choose(&mut rng).unwrap();

    let prefix: String = (0..prefix_len).map(|_| rand_hanzi()).collect();

    Value::String(format!("{}{}", prefix, suffix))
}

/// 生成单个汉字（常用字范围）, 限制到常用汉字范围（0x4E00-0x62FF）包含约5000常用字
pub fn rand_hanzi() -> char {
    let mut rng = rand::thread_rng();
    // let unicode_chars: Vec<char> = (0..1)
    //     .map(|_| rng.gen_range(0x4E00..=0x9FA5) as u32)
    //     .map(std::char::from_u32)
    //     .flatten()
    //     .collect();
    // unicode_chars.into_iter().collect()

    let code = rng.gen_range(0x4E00..=0x9FA5);
    std::char::from_u32(code).unwrap_or('汉')
}

/// 生成随机的Unicode字符
/// 生成范围在0x4E00到0x9FFF之间的随机数，将其转换为Unicode字符，并将它们收集到一个Vec<char>中。
/// 最后，通过迭代Vec<char>并将字符收集到一个String中，生成了一个随机的Unicode字符串
///
/// 请注意，这个方法生成了基本的CJK（中日韩）字符范围内的Unicode字符
pub fn generate_random_unicode() -> String {
    let mut rng = rand::thread_rng();
    let unicode_chars: Vec<char> = (0..1)
        .map(|_| rng.gen_range(0x4E00..=0x9FFF) as u32)
        .map(std::char::from_u32)
        .flatten()
        .collect();

    unicode_chars.into_iter().collect()
}

pub fn is_uncommon_hanzi(c: char) -> bool {
    let code = c as u32;

    !GB2312_RANGES.iter().any(|&(start, end)| code >= start && code <= end)
        // || code.is_ascii()  // 排除ASCII字符
        || c.is_ascii_punctuation() // 排除标点
}
